home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 4.1 / background-doits.st < prev    next >
Text File  |  1993-07-24  |  4KB  |  123 lines

  1. "    NAME        background-doits
  2.     AUTHOR        miw@cs.man.ac.uk (Mario Wolczko)
  3.     FUNCTION    Optionally execute doits and inspect in the background
  4.     ST-VERSION    4.1
  5.     PREREQUISITES    
  6.     CONFLICTS    ParagraphEditor>doIt, ParagraphEditor>inspectIt
  7.     DISTRIBUTION    world
  8.     VERSION        1
  9.     DATE         1992
  10. SUMMARY
  11.  
  12. If you know that the result of a 'do it' or 'inspect' is going to
  13. take a long time, it's sometime desirable for it to run as a
  14. background process, letting you continue interactions.
  15.  
  16. This goodie modifies the standard 'do it' and 'inspect' behaviour so
  17. that the evaluation is run in the background if a shift key is down
  18. when the evaluation is invoked.
  19.  
  20. To do this, we have to extend the behaviour of the compiler slightly
  21. so that we can perform the compilation in the foreground, before
  22. running the result of the compilation in the background.
  23.  
  24. Mario Wolczko
  25.  
  26.  
  27. Dept. of Computer Science   Internet: mario@cs.man.ac.uk
  28. The University              uucp: uknet!!man.cs!!mario
  29. Manchester M13 9PL          JANET: mario@uk.ac.man.cs
  30. U.K.                        Tel: +44-61-275 6146  (FAX: 6236)
  31. ______the mushroom project___________________________________
  32.  
  33. "
  34. 'From Objectworks\Smalltalk 4.1, 9 June 1993'!
  35.  
  36. !ParagraphEditor methodsFor: 'private'!
  37.  
  38. compileSelection
  39.     "Compiler the current text selection as an expression, return a block that will evaulate it."
  40.  
  41.     | result selectionStart oldTextSize selection |
  42.     selectionStart := self selectionStartIndex.
  43.     oldTextSize := self text size.
  44.     selection := self selection.
  45.     result := 
  46.         self doItReceiver class evaluatorClass new
  47.                 compile: self selectionAsStream
  48.                 in: nil
  49.                 receiver: self doItReceiver
  50.                 notifying: self
  51.                 ifFail: 
  52.                     [^self class compilationErrorSignal raise].
  53.     self selection asString = selection asString ifFalse:
  54.         [self selectFrom: selectionStart  "Reselect doIt range after compiler interaction"
  55.             to: selectionStart + selection size - 1 + (self text size - oldTextSize)].
  56.     SourceFileManager default logChange: self selection string.
  57.     ^result! !
  58.  
  59. !ParagraphEditor methodsFor: 'menu messages'!
  60.  
  61. doIt
  62.     "Evaluate the current text selection as an expression"
  63.  
  64.     sensor shiftDown ifTrue: [^self doItBackground].
  65.     self class compilationErrorSignal
  66.         handle: [:ex | ex returnWith: nil]
  67.         do: [self evaluateSelection]!
  68.  
  69. doItBackground
  70.     "Evaluate the current text selection as an expression.
  71.     Perform the evaluation as a background process."
  72.  
  73.     | block |
  74.     self class compilationErrorSignal
  75.         handle: [:ex | ex returnWith: nil]
  76.         do: [block := self compileSelection].
  77.     block forkAt: Processor userBackgroundPriority!
  78.  
  79. inspectIt
  80.     "Evaluate the current text selection as an expression"
  81.  
  82.     sensor shiftDown ifTrue: [^self inspectItBackground].
  83.      self class compilationErrorSignal
  84.         handle: [:ex | ex returnWith: nil]
  85.         do: [self evaluateSelection inspect]!
  86.  
  87. inspectItBackground
  88.     "Evaluate the current text selection as an expression.
  89.     Perform the evaluation as a background process."
  90.  
  91.     | block |
  92.     self class compilationErrorSignal
  93.         handle: [:ex | ex returnWith: nil]
  94.         do: [block := self compileSelection].
  95.     [block value inspect] forkAt: Processor userBackgroundPriority! !
  96.  
  97. !SmalltalkCompiler methodsFor: 'public access'!
  98.  
  99. compile: textOrStream in: aContext receiver: receiver notifying: aRequestor ifFail: failBlock 
  100.     "Compiles the sourceStream into a parse tree, then generates code 
  101.     into a method.  If receiver is not nil, then the text can refer to
  102.     instance variables of that receiver (the Inspector uses this).  If 
  103.     aContext is not nil, the text can refer to temporaries in that context
  104.     (the Debugger uses this).  If aRequestor is not nil, then it will
  105.     receive a notify:at: message before the attempt to evaluate is aborted. 
  106.     
  107.     Finally, a block is returned, which when evaluated, will evaluate the compiled method and return its result."
  108.  
  109.     | methodNode method |
  110.     class := (aContext == nil
  111.                 ifTrue: [receiver]
  112.                 ifFalse: [aContext homeReceiver]) class.
  113.     self from: textOrStream
  114.         class: class
  115.         context: aContext
  116.         notifying: aRequestor.
  117.     methodNode := self translate: sourceStream noPattern: true ifFail: [^failBlock value].
  118.     method := methodNode generate.
  119.     ^context == nil
  120.         ifTrue:    [^[receiver performMethod: method]]
  121.         ifFalse: [^[receiver performMethod: method with: context]]! !
  122.  
  123.